//package com.fabric.contract;
//
//import com.alibaba.fastjson.JSON;
//import com.google.common.collect.Lists;
//import lombok.extern.java.Log;
//import org.apache.commons.lang3.StringUtils;
//import org.hyperledger.fabric.contract.Context;
//import org.hyperledger.fabric.contract.ContractInterface;
//import org.hyperledger.fabric.contract.annotation.*;
//import org.hyperledger.fabric.shim.ChaincodeException;
//import org.hyperledger.fabric.shim.ChaincodeStub;
//import org.hyperledger.fabric.shim.ledger.KeyValue;
//import org.hyperledger.fabric.shim.ledger.QueryResultsIterator;
//
//import java.util.List;
//
//@Contract(
//        name = "PortContractChaincode",
//        info = @Info(
//                title = "港口与货主电子合同管理合约",
//                description = "用于港口与货主间的合同管理，包括合同的创建、修改、查询、删除等功能。",
//                version = "1.0.0"
//        )
//)
//@Default
//@Log
//public class ContractChaincode implements ContractInterface {
//
//    private static final String PREFIX = "CONTRACT_";
//    // 创建和存储状态到 CouchDB
//    @Transaction(intent = Transaction.TYPE.SUBMIT)
//    public void setState(Context ctx, String key, String value) {
//        ChaincodeStub stub = ctx.getStub();
//        stub.putState(key, value.getBytes());  // 使用 CouchDB 存储状态
//        log.info("状态已存储: " + key);
//    }
//
//    // 获取存储在 CouchDB 中的状态
//    @Transaction(intent = Transaction.TYPE.EVALUATE)
//    public String getState(Context ctx, String key) {
//        ChaincodeStub stub = ctx.getStub();
//        return stub.getStringState(key);  // 使用 CouchDB 获取状态
//    }
//
//    @Transaction(intent = Transaction.TYPE.SUBMIT)
//    public void createContract(Context ctx, String contractJson) {
//        ChaincodeStub stub = ctx.getStub();
//        BussinessContractDTO contract = JSON.parseObject(contractJson, BussinessContractDTO.class);
//
//        // 校验字段完整性
//        validateContract(contract, true);
//
//        String key = PREFIX + contract.getContractId();
//        if (StringUtils.isNotBlank(stub.getStringState(key))) {
//            throw new ChaincodeException("合同已存在，合同ID：" + contract.getContractId());
//        }
//
//        stub.putStringState(key, JSON.toJSONString(contract));
//        log.info("✅ 合同创建成功：" + contract.getContractId());
//    }
//
//    @Transaction(intent = Transaction.TYPE.SUBMIT)
//    public void updateContract(Context ctx, String contractJson) {
//        ChaincodeStub stub = ctx.getStub();
//        BussinessContractDTO contract = JSON.parseObject(contractJson, BussinessContractDTO.class);
//
//        validateContract(contract, false);
//
//        String key = PREFIX + contract.getContractId();
//        if (StringUtils.isBlank(stub.getStringState(key))) {
//            throw new ChaincodeException("合同不存在，无法更新，合同ID：" + contract.getContractId());
//        }
//
//        stub.putStringState(key, JSON.toJSONString(contract));
//        log.info("✅ 合同更新成功：" + contract.getContractId());
//    }
//
//    @Transaction(intent = Transaction.TYPE.SUBMIT)
//    public void deleteContract(Context ctx, String contractId) {
//        ChaincodeStub stub = ctx.getStub();
//        if (StringUtils.isBlank(contractId)) {
//            throw new ChaincodeException("合同ID不能为空");
//        }
//
//        String key = PREFIX + contractId;
//        if (StringUtils.isBlank(stub.getStringState(key))) {
//            throw new ChaincodeException("合同不存在，无法删除，合同ID：" + contractId);
//        }
//
//        stub.delState(key);
//        log.info("✅ 合同删除成功：" + contractId);
//    }
//
//    @Transaction(intent = Transaction.TYPE.EVALUATE)
//    public String queryContract(Context ctx, String contractId) {
//        if (StringUtils.isBlank(contractId)) {
//            throw new ChaincodeException("合同ID不能为空");
//        }
//
//        ChaincodeStub stub = ctx.getStub();
//        String key = PREFIX + contractId;
//        String result = stub.getStringState(key);
//
//        if (StringUtils.isBlank(result)) {
//            throw new ChaincodeException("未找到合同，合同ID：" + contractId);
//        }
//
//        log.info("✅ 查询到合同：" + contractId);
//        return result;
//    }
//
//    @Transaction(intent = Transaction.TYPE.EVALUATE)
//    public String queryContractByOwnerAndType(Context ctx, String owner, String contractType) {
//        if (StringUtils.isAnyBlank(owner, contractType)) {
//            throw new ChaincodeException("合同货主或合同类型不能为空");
//        }
//
//        ChaincodeStub stub = ctx.getStub();
//        String query = String.format("{\"selector\":{\"owner\":\"%s\",\"contractType\":\"%s\"}}", owner, contractType);
//        QueryResultsIterator<KeyValue> results = stub.getQueryResult(query);
//
//        List<BussinessContractDTO> contracts = Lists.newArrayList();
//        for (KeyValue kv : results) {
//            contracts.add(JSON.parseObject(kv.getStringValue(), BussinessContractDTO.class));
//        }
//
//        return JSON.toJSONString(contracts);
//    }
//
//    @Override
//    public void beforeTransaction(Context ctx) {
//        log.info("🔍 开始事务执行...");
//    }
//
//    @Override
//    public void afterTransaction(Context ctx, Object result) {
//        log.info("✅ 事务执行完毕。返回值：" + result);
//    }
//
//    // 合同字段基础校验
//    private void validateContract(BussinessContractDTO contract, boolean checkId) {
//        if (contract == null) {
//            throw new ChaincodeException("合同信息不能为空");
//        }
//        if (checkId && StringUtils.isBlank(contract.getContractId())) {
//            throw new ChaincodeException("合同ID不能为空");
//        }
//        if (StringUtils.isBlank(contract.getOwner())) {
//            throw new ChaincodeException("货主不能为空");
//        }
//        if (StringUtils.isBlank(contract.getContractType())) {
//            throw new ChaincodeException("合同类型不能为空");
//        }
//        if (StringUtils.isBlank(contract.getEffectDate())) {
//            throw new ChaincodeException("生效日期不能为空");
//        }
//        if (StringUtils.isBlank(contract.getExpirationDate())) {
//            throw new ChaincodeException("终止日期不能为空");
//        }
//    }
//
//    // 分页结果封装类
//    public static class PageResult {
//        private List<BussinessContractDTO> contracts;
//        private String bookmark;
//
//        public List<BussinessContractDTO> getContracts() {
//            return contracts;
//        }
//
//        public PageResult setContracts(List<BussinessContractDTO> contracts) {
//            this.contracts = contracts;
//            return this;
//        }
//
//        public String getBookmark() {
//            return bookmark;
//        }
//
//        public PageResult setBookmark(String bookmark) {
//            this.bookmark = bookmark;
//            return this;
//        }
//    }
//}
